package com.rem.concurrency.juc.my3Pc;

/**
 * 两个线程的 生产者和消费者
 *
 * @author Rem
 * @date 2021-03-08
 */

public class A {

    public static void main(String[] args) {
        Data data = new Data();

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "A").start();


        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "B").start();

    }
}

class Data {

    int num = 0;

    /**
     * +1操作
     */
    synchronized void increment() throws InterruptedException {
        if (num != 0) {
            //不等于0 等待其他线程操作
            this.wait();
        }
        num++;
        System.out.println(Thread.currentThread().getName() + "==>" + num);
        //操作完毕 ，通知其他线程操作
        this.notifyAll();
    }

    /**
     * -1操作
     */
    synchronized void decrement() throws InterruptedException {
        if (num == 0) {
            //等于0 等待其他线程操作
            this.wait();
        }
        num--;
        System.out.println(Thread.currentThread().getName() + "==>" + num);
        //操作完毕 ，通知其他线程操作
        this.notifyAll();
    }
}
